微观数学机制——为什么矩阵乘法能“识别”关键词?
你问的重点是:“为什么QKV这么操作就可以识别关键词?” 答案在于训练好的权重矩阵 $W_Q, W_K, W_V$ 将词向量投影到了特定的语义空间。
让我们看一个具体的例子:句子是 "The animal didn't cross the street because it was too tired."
我们想知道,当模型处理到 "it" 这个词时,它是怎么识别出 "it" 指代的是 "animal" 而不是 "street"?
1. 投影变换 (Projection)
输入词是 "it"。模型把它对应的向量 $x_{it}$ 分别乘以三个权重矩阵,得到 $q_{it}, k_{it}, v_{it}$。
- $W_Q$ 的作用是:把 $x_{it}$ 转换成一种“寻找指代对象”的提问状态。
- $q_{it}$ 的向量方向可能代表:“我在找一个能够发出‘累(tired)’这个动作的名词。”
2. 生成Keys (Generating Keys)
句子中其他词 "animal" 和 "street" 也生成了各自的 $k_{animal}$ 和 $k_{street}$。
- $W_K$ 的作用是:把 $x_{animal}$ 和 $x_{street}$ 转换成“特征标签”。
- $k_{animal}$ 的向量方向可能编码了:“我是有生命物体,能感觉累。”
- $k_{street}$ 的向量方向可能编码了:“我是无生命物体,地点。”
3. 匹配与“识别” (Matching - The Dot Product)
现在计算点积:
- $q_{it} \cdot k_{animal}$:因为“寻找发出动作的主体”与“有生命物体”在向量空间方向一致,点积很大。
- $q_{it} \cdot k_{street}$:因为“寻找发出动作的主体”与“无生命地点”方向垂直或相反,点积很小。
这就是“识别”发生的时刻! 所谓“识别关键词”,在数学上表现为:Query向量和Key向量在高维空间中的夹角很小(高度对齐)。
4. 信息提取 (Value Extraction)
因为 $q_{it}$ 和 $k_{animal}$ 的关注度(Attention Score)很高,模型就会大量提取 "animal" 对应的 $v_{animal}$ 信息。
- 最终,"it" 这个位置的输出向量,实际上融合了大量 "animal" 的语义信息。
- 所以,下一层网络再处理 "it" 时,就已经把它当成 "animal" 来看待了。
多头注意力(Multi-Head Attention)是如何让模型同时捕捉“语法”和“语义”等不同层面的关键词的?
技术原理拆解
让我们回到数学层面,看看这是如何发生的。
假设我们输入的词向量维度 $d_{model} = 512$,我们有 8 个头 ($h=8$)。
1. 空间的切分 (Splitting the Space)
模型并没有让一个巨大的 $512 \times 512$ 矩阵去处理所有事情,而是将其拆分成 8 个 $512 \times 64$ 的小矩阵($d_k = d_v = d_{model}/h = 64$)。
这意味着,每个 Head 只能看到词向量中的一部分特征,或者说是将词向量投影到了一个低维子空间。
2. 独立权重的自动分化 (Automatic Differentiation of Weights)
这是关键所在。每个 Head 都有独立的 $W_Q^i, W_K^i, W_V^i$。
在反向传播训练时,为了降低 Loss,不同的 Head 会被迫去关注不同的特征:
- Head A 的权重演化:可能发现关注“相邻词”能极大地降低预测错误的概率(捕捉n-gram语法特征),于是它的 $W_Q, W_K$ 训练成倾向于匹配相邻位置。
- Head B 的权重演化:可能发现关注“句子开头的主语”对理解全句很重要(捕捉指代关系),于是它的权重学会了跨越长距离去寻找名词。
3. 可视化证据 (Visual Evidence from Research)
在经典的 Transformer 论文("Attention Is All You Need")以及后续的可解释性研究中,研究者将训练好的 Head 的注意力图(Attention Map)画出来,观察到了惊人的现象:
- 语法头(Syntactic Heads):
- 有的 Head 的高亮区域呈现明显的对角线形状。这意味着它只关注当前词的前一个词或后一个词(捕捉短语结构,如 "New York")。
- 有的 Head 专门关注动词和它的直接宾语,哪怕中间隔了几个形容词。
- 语义头(Semantic Heads):
- 有的 Head 在处理 "it", "she", "he" 时,注意力线会跨越很远的距离,精准连接到前文出现的实体(Entity)。
- 有的 Head 在处理 "bank"(银行/河岸)时,会去关注句尾的 "money" 或 "river",从而消除歧义。
4. 信息的融合 (Integration)
最后,所有 Head 计算出的 $V$(也就是它们各自提取出的信息)被拼接在一起,再经过一个大的权重矩阵 $W^O$ 进行融合。
这一步相当于把“语法信息向量”和“语义信息向量”揉在一起,传递给下一层网络。
总结:为什么必须要“多头”?
如果只有一个超级大的单头(Single Head):
- 注意力冲突:Q 和 K 的点积只能得出一个标量分数。如果同一个词既要在语法上关注紧挨着的词,又要在语义上关注句首的词,一个标量是无法同时表示这种“既近又远”的矛盾关系的。
- 平均化风险:强行用一个头处理所有关系,会导致注意力权重变得平庸(Averaging out),既抓不住语法重点,也抓不住语义重点。
多头注意力(MHA)通过让不同的头“各司其职”,在互不干扰的子空间内分别寻找最佳匹配,最终实现了对语言复杂性的全面捕捉。 这就是 Transformer 能够同时由表及里(从语法到语义)理解文本的秘密。
为什么多头注意力训练过程中可以让不同的头各司其职,而不是几个头都干一样的事
1. 初始化的蝴蝶效应(Random Initialization)
这是最基础的物理原因。
- 起点不同:在训练开始前,每个 Head 的权重矩阵 $W_Q^i, W_K^i, W_V^i$ 都是被随机初始化的(通常服从正态分布或 Xavier 初始化)。
- 轨迹分岔:因为起点不同,它们在优化空间(Loss Landscape)中所处的位置就不同。
- Head A 初始时可能恰好对“位置相近的词”反应比较大。
- Head B 初始时可能恰好对“词性相同的词”反应比较大。
- 梯度流向不同:梯度下降算法是“贪婪”的,它会沿着当前最陡峭的方向走。因为初始位置不同,Head A 和 Head B 接收到的梯度更新方向也是不同的。Head A 会沿着它的路径越走越远,Head B 也会沿着自己的路径强化特征。
直观理解:就像把几个球放在山顶的不同侧面往下滚,哪怕山脚只有一个最低点,它们滚下去的路径(学习到的特征模式)也是完全不同的。
2. 冗余是有代价的(Dropout 与 资源竞争)
如果几个 Head 真的学到了完全一样的东西,会发生什么?
- Dropout 机制(关键因素):Transformer 在训练时大量使用了 Dropout(随机丢弃神经元)。
- 假设 Head 1 和 Head 2 干了完全一样的事(比如都关注主语)。
- 如果某次训练中,Head 1 被 Dropout 关掉了,模型为了维持性能,Head 2 必须能扛起大旗。
- 但更常见的情况是,如果多个 Head 功能高度重叠,模型会发现这种配置极其脆弱且浪费参数。
- 为了在 Dropout 的干扰下依然保持低 Loss,模型倾向于让不同的 Head 捕捉互补的信息(Complementary Information)。如果 Head 1 挂了,Head 2 提供的不是重复信息,而是不同维度的补充信息,这样总体的鲁棒性更强。
- 维度的正交性倾向:数学上,高维空间本身就非常大。两个随机初始化的向量在高维空间中大概率是接近正交(垂直)的。模型想要把它们“训练成一样”,反而需要花费很大的力气去克服这种天然的差异。只要 Loss 能下降,模型通常会顺着它们天然正交的方向去优化。
3. 只有“分工”才能达到 Loss 的全局最优
这是最本质的动力学原因。
- 任务的复杂性:自然语言太复杂了。预测下一个词(Next Token Prediction)需要同时考虑语法、语义、指代、常识、语气等。
- 单一视角的局限:
- 如果 8 个 Head 全部都学会了“看语法”,那么在遇到需要“看指代”才能解出的题时(比如 "The trophy didn't fit in the suitcase because it was too big"),模型就会预测错误,Loss 会变大。
- 为了降低这个 Loss,梯度反向传播会“惩罚”那些只看语法的 Head,迫使其中一部分 Head 改变方向,去关注指代关系。
只有当 8 个 Head 分别覆盖了语言的不同侧面时,总体的 Loss 才能降到最低。 就像一个足球队,如果 11 个人都当守门员,球队一定会输。为了赢球(降低 Loss),必须有人当前锋,有人当后卫。
4. 补充事实:其实真的会有“同质化”
必须客观指出,虽然我们希望它们各司其职,但实际研究发现,并不是所有的 Head 都那么“聪明”和“独立”。
- Head Pruning(头剪枝)的研究:NeurIPS 2019 有一篇著名的论文 "Are Sixteen Heads Really Better Than One?"。研究者发现,在 BERT 等模型训练好之后,去掉很多 Head,模型性能几乎不下降。
- 懒惰的 Head:这说明,确实有一些 Head 即使随机初始化不同,最后也学到了相似的、冗余的特征,或者干脆没学到什么重要的东西。
- 主要分工与次要冗余:大部分重要的分工(语法 vs 语义)是由少部分关键的 Head 完成的,而剩下的 Head 往往起到了“备份”或者“平滑噪音”的作用。